package pers.cz.jefconfig.log;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.logging.*;

/**
 * 日志打印工具,第一版完全使用java自带的日志处理工具
 * @program: PostGirl-panent
 * @description: LogUtils
 * @author: Cheng Zhi
 * @create: 2021-12-19 11:01
 **/
public class LogUtils {

    private static Logger log;

    static {
        log = Logger.getLogger("JEF-CONFIG");
        // 禁用默认的处理程序
        Logger rootLogger = Logger.getLogger("");
        Handler[] defaultHandlers = rootLogger.getHandlers();
        for (Handler handler : defaultHandlers) {
            rootLogger.removeHandler(handler);
        }

        String loglevel = System.getProperty("loglevel");

        if (loglevel == null) {
            loglevel = "";
        }
        switch (loglevel) {
            case "debug":
                log.setLevel(Level.FINE);
                break;
            case "info":
                log.setLevel(Level.INFO);
                break;
            case "error":
                log.setLevel(Level.SEVERE);
                break;
            default:
                log.setLevel(Level.ALL);
        }

        log.addHandler(customConsoleHandler()); // 使用完成之后需要移出
        // 默认日志不保存，如需保存使用时需设置  System.setProperty("isSaveLog", "true");
        String isSaveLog = System.getProperty("isSaveLog");
        if ("true".equalsIgnoreCase(isSaveLog)) {
            log.addHandler(customFileHandler());
        }
    }
    public LogUtils(Class clazz) {
        log = Logger.getLogger(clazz.getName());
    }

    /**
     * 打印debug级别日志
     * @param content
     */
    public void printDebug(String content) {

        log.log(Level.FINE, content);
    }

    /**
     * 打印info级别日志
     * @param content
     */
    public void printInfo(String content) {
        log.info(content);
    }

    /**
     * 打印error级别日志
     * @param content
     */
    public void printError(String content) {
        log.log(Level.SEVERE, content);
    }

    /**
     * 打印debug级别的复杂对象
     * @param content
     * @param object
     */
    public void printObject(String content, Object object) {

        //log.log(Level.FINE, );
    }

    /**
     * 默认debug实现
     * @param msg
     */
    public static void debug(String msg) {
        log.log(Level.FINE, msg);
    }

    /**
     * 默认info实现
     * @param msg
     */
    public static void info(String msg)  {
        log.log(Level.INFO, msg);
    }

    /**
     * 默认error实现
     * @param msg
     * @param es
     */
    public static void error(String msg , Throwable... es) {
        log.log(Level.SEVERE, msg);
        for (Throwable e : es) {
            e.printStackTrace();
        }
    }

    /**
     * 默认warn实现
     * @param msg
     */
    public static void warn(String msg) {
        log.log(Level.WARNING, msg);
    }

    /**
     * 自定义控制台打印级别
     * @return
     */
    private static ConsoleHandler customConsoleHandler() {
        ConsoleHandler consoleHandler = new ConsoleHandler();
        consoleHandler.setLevel(Level.ALL);
        consoleHandler.setFormatter(new CustomFormatter());
        return consoleHandler;
    }
    /**
     * 日志文件保存   todo 路径、文件名、格式建议从配置中读取，暂时先写死
     * @return
     */
    private static FileHandler customFileHandler() {
        FileHandler fileHandler = null;

        try {
            String filePath = "C:\\" + File.separator + "logs";
            String logPath = "logger-cz-20220714.log";
            File fi = new File(filePath);
            if ((fi.exists()) && (fi.isDirectory())) {
                logPath = filePath + File.separator + logPath;
            } else if (!fi.exists()) {
                fi.mkdirs();
                logPath = filePath + File.separator + logPath;
            }
            fileHandler = new FileHandler(logPath, true); // true表示在文件中追加
            fileHandler.setLevel(Level.ALL);
            fileHandler.setFormatter(new CustomFormatter());
            return fileHandler;
        } catch (Exception e) {

        }

        return null;
    }

    /**
     * 自定义日志格式
     */
    public static class CustomFormatter extends Formatter {

        /**
         SimpleDateFormat函数语法：
         G 年代标志符
         y 年
         M 月
         d 日
         h 时 在上午或下午 (1~12)
         H 时 在一天中 (0~23)
         m 分
         s 秒
         S 毫秒
         E 星期
         D 一年中的第几天
         F 一月中第几个星期几
         w 一年中第几个星期
         W 一月中第几个星期
         a 上午 / 下午 标记符
         k 时 在一天中 (1~24)
         K 时 在上午或下午 (0~11)
         z 时区
         */
        private SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, yyyy hh:mm:ss a", Locale.CHINA);

        @Override
        public String format(LogRecord record) {
            StringBuilder sb = new StringBuilder();
            String dataFormat = this.sdf.format(Long.valueOf(record.getMillis()));
            sb.append(dataFormat).append(" ");
            sb.append(record.getLoggerName()).append(" ");
            sb.append(record.getSourceClassName()).append(" ");
            sb.append(record.getSourceMethodName()).append(" ");
            sb.append(":");
            sb.append(record.getMessage()).append("\n");

            return sb.toString();
        }
    }

    public static void main(String[] args) {
        LogUtils.debug("你好");
        LogUtils.warn("你好");
    }
}
